package top.ahzy.seobench.util;

import cn.hutool.core.date.DateUtil;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import top.ahzy.seobench.config.JWTConfig;
import top.ahzy.seobench.model.entity.User;

import java.util.Date;

@Slf4j
public class JwtUtil {

    /**
     * 创建Token
     *
     * @param user 用户信息
     * @return
     */
    public static String createAccessToken(User user) {
        String token = Jwts.builder()// 设置JWT
                .setId(user.getId()) // 用户Id
                .setSubject(user.getUsername()) // 主题
                .setIssuedAt(new Date()) // 签发时间
                .setIssuer("seobench") // 签发者
                .setExpiration(new Date(System.currentTimeMillis() + JWTConfig.expiration)) // 过期时间
                .signWith(SignatureAlgorithm.HS512, JWTConfig.secret) // 签名算法、密钥
                .claim("createTime", DateUtil.formatDateTime(user.getCreateTime())).compact(); // 其他信息
        return JWTConfig.tokenPrefix + token;
    }

    /**
     * 解析Token
     *
     * @param token Token信息
     * @return
     */
    public static User parseAccessToken(String token) {
        User user = null;
        if (StringUtils.isNotEmpty(token)) {
            try {
                // 去除JWT前缀
                token = token.substring(JWTConfig.tokenPrefix.length());

                // 解析Token
                Claims claims = Jwts.parser().setSigningKey(JWTConfig.secret).parseClaimsJws(token).getBody();
                String username = claims.getSubject();
                // 获取用户信息
                user = new User();
                user.setId(claims.getId());
                user.setUsername(username);
                Date createTime = DateUtil.parse(claims.get("createTime").toString());
                user.setCreateTime(createTime);
                Date expiration = claims.getExpiration();
                Date date = new Date();
                if(expiration.getTime() < date.getTime()){
                    return null;
                }

            } catch (Exception e) {
                log.error("解析Token异常：" + e);
            }
        }
        return user;
    }
}
